#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
int main(){
	ios::sync_with_stdio(false);  
    cin.tie(0);   
	int n;
	cin>>n;
	 // 构建邻接表，索引从 1 到 n
	vector<vector<int>>adj(n+1);
	// 构建邻接表
    for (int i = 0; i < n - 1; ++i) {  // 树有 n-1 条边
        int x, y;
        cin >> x >> y;                 // 输入每条边的两个端点
        adj[x].push_back(y);           // 添加双向边
        adj[y].push_back(x);
    }
	 // 存储待验证的 BFS 序列       
	vector<int>sequence(n);
	// 记录每个节点在序列中的位置（索引）
	vector<int>pos(n+1);
	for(int i=0;i<n;++i){
		cin >> sequence[i];       // 输入待验证的序列
        pos[sequence[i]] = i;     // 记录该节点在序列中的位置
	}
	  // 对每个节点的邻接点按照在序列中的顺序排序
    for (int i = 1; i <= n; ++i) {
        sort(adj[i].begin(), adj[i].end(), [&](int u, int v) {
            return pos[u] < pos[v];  // 按照节点在 sequence 中的位置排序
        });
    }
	//开始BFS
	 vector<bool> visited(n + 1, false);  // 初始化访问数组
	 queue<int>q;
	 q.push(sequence[0]);// 从序列的第一个节点开始 BFS
	 visited[sequence[0]] = true;  // 标记为已访问
	 int idx=0;// 当前遍历到的序列位置
	 while(!q.empty()){
	 	int current=q.front() ;
	 	q.pop();
	 	 // 如果当前节点与预期的序列不一致，则不是有效的 BFS 序列
        if (current != sequence[idx++]) {
            cout << "No" << endl;
            return 0;             // 直接结束程序
        }
        // 遍历当前节点的所有邻接点
        for (int neighbor : adj[current]) {
            if (!visited[neighbor]) {
                visited[neighbor] = true;  // 标记为已访问
                q.push(neighbor);          // 加入队列等待处理
            }
        }
	 }
	 // 如果所有节点都按顺序匹配成功，则是有效的 BFS 序列
    cout << "Yes" << endl;
    return 0;
	 
}